import torch
import torch_sparse

filter = torch.FloatTensor([
    [0.1, 0.2, 0.3, 0.4],
    [0.2, 0.1, 0.3, 0.5]

])
num_channels = filter.shape[0]
results = []
num_nodes = 10
A = [
    (torch.LongTensor([[0, 0, 1, 2, 2, 3, 4], [5, 7, 5, 6, 7, 6, 6]]), torch.FloatTensor([1, 1, 1, 1, 1, 1, 1])),
    (torch.LongTensor([[5, 7, 5, 6, 7, 6, 6], [0, 0, 1, 2, 2, 3, 4]]), torch.FloatTensor([1, 1, 1, 1, 1, 1, 1])),
    (torch.LongTensor([[0, 1, 2, 3, 4], [8, 8, 9, 8, 9]]), torch.FloatTensor([1, 1, 1, 1, 1])),
    (torch.LongTensor([[8, 8, 9, 8, 9], [0, 1, 2, 3, 4]]), torch.FloatTensor([1, 1, 1, 1, 1]))
]

for i in range(num_channels):
    for j, (edge_index, edge_value) in enumerate(A):
        # print("##########################")
        # print("i={},j={},filter[i][j]={}".format(i, j, filter[i][j]))
        # print("total_edge_index = ", edge_index)
        # print("edge_value * filter[i][j] = {} * {} = {}".format(edge_value, filter[i][j], edge_value * filter[i][j]))
        # print("##########################")
        if j == 0:
            total_edge_index = edge_index
            total_edge_value = edge_value * filter[i][j]
        else:
            total_edge_index = torch.cat((total_edge_index, edge_index), dim=1)
            # print("total_edge_indextotal_edge_index",total_edge_index)
            total_edge_value = torch.cat((total_edge_value, edge_value * filter[i][j]))
        # print(total_edge_index)
        # print(total_edge_value)

    index, value = torch_sparse.coalesce(
        total_edge_index.detach(),
        total_edge_value,
        m=num_nodes, n=num_nodes, op='add')

    results.append((index, value))
print(results)
# 1、首先我们找到5种点边关系，每个边都有一个权重。
# 2、我们使用通过softmax确定的权重参数，它的格式是 输出channel * 输入 channel
# 输入channel的所有的权重值综总和 为1
# 3、循环输出channel数，对5种点边关系的边权重值乘以相应的 输入权重值，得到的结果组成该channel下的新的点边关系和边权重信息
# 4、重复输出channel次，最终得到 输出channel组信息，每一组是一个点边关系和新的权重值。
# 由5个邻接矩阵得到 2组（channel数） 点与点关系 以及 权重值。
# 内涵 五个邻接矩阵（只关注片面的关系的）组成一个带有权重的 大的全局邻接矩阵。（在每一个通道上）
